package sv.com.renacempleo.dao.red;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Vector;

import org.apache.commons.lang.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

import sv.com.renacempleo.dao.BaseDaoImpl;
import sv.com.renacempleo.dto.red.RedDemandantes;
import sv.com.renacempleo.dto.red.RedFormacionDemandante;
import sv.com.renacempleo.dto.red.RedIdiomasDemandante;
import sv.com.renacempleo.dto.red.RedPuestoBuscaDemandante;
import sv.com.renacempleo.exception.WebException;
import sv.com.renacempleo.web.security.CustomUser;
import sv.com.renacempleo.web.util.WebUtilidades;

public class RedDemandanteDaoImpl extends BaseDaoImpl implements RedDemandanteDao{

	@SuppressWarnings("unchecked")
	public List<Object[]> findAllActivesAsArray() throws WebException {
		DetachedCriteria criteria = DetachedCriteria.forClass(RedDemandantes.class);
		criteria.addOrder(Order.asc("redDemandanteNombres"));
		criteria.addOrder(Order.asc("redDemandanteApellidos"));
		criteria.add(Restrictions.eq("redDemandanteEstado", "0"));
		criteria.createAlias("wkfEstadoSeguimiento", "wkfEstadoSeguimiento", Criteria.LEFT_JOIN);
		criteria.createAlias("sgdUsuario", "sgdUsuario");
		criteria.createAlias("sgdUsuario.ctgOficina", "ctgOficina");
		criteria.createAlias("ctgMunicipioResidencia", "ctgMunicipio", Criteria.LEFT_JOIN);
		criteria.setProjection(Projections.projectionList().
				add(Projections.property("redDemandanteFolio")).
				add(Projections.property("redDemandanteFullName")).
				add(Projections.property("redDemandanteFechaRegistro")).
				add(Projections.property("wkfEstadoSeguimiento.ctgCatalogoNombre")).
				add(Projections.property("sgdUsuario.sgdUsuarioUsuario")).
				add(Projections.property("redDemandanteDUI")).
				add(Projections.property("ctgOficina.ctgOficinaNombre")).
				add(Projections.property("redDemandanteEstado")).
				add(Projections.property("redDemandanteTelefono1"))
		);
		return (List<Object[]>) findByCriteria(criteria);
	}

	@SuppressWarnings("unchecked")
	public List<Object[]> findAllInactivesAsArray() throws WebException {
		DetachedCriteria criteria = DetachedCriteria.forClass(RedDemandantes.class);
		criteria.addOrder(Order.asc("redDemandanteNombres"));
		criteria.addOrder(Order.asc("redDemandanteApellidos"));
		criteria.add(Restrictions.eq("redDemandanteEstado", "0"));
		return (List<Object[]>) findByCriteria(criteria);
	}

	@Override
	public List<Object[]> findAllAsArray() throws WebException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Object[]> findDemandanteByOficina() throws WebException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Object[]> findDemandanteByAgente() throws WebException {
		// TODO Auto-generated method stub
		return null;
	}

	@SuppressWarnings("unchecked")
	public List<Object[]> findDemandanteByDocumento(Long ctgDocumentoId, String redDemandanteNumeroDocumento) throws WebException {
		DetachedCriteria criteria = DetachedCriteria.forClass(RedDemandantes.class);
		criteria.add(Restrictions.eq("ctgDocumento.ctgDocumentoId",ctgDocumentoId));
		criteria.add(Restrictions.eq("redDemandanteNumeroDocumento",redDemandanteNumeroDocumento));
		return (List<Object[]>) findByCriteria(criteria);
	}
	
	@SuppressWarnings({ "unchecked" })
	public RedDemandantes getDemandante(Long redDemandanteFolio) throws WebException{
		DetachedCriteria criteria = DetachedCriteria.forClass(RedDemandantes.class);
		criteria.add(Restrictions.eq("redDemandanteFolio",redDemandanteFolio));
		List<RedDemandantes> list = (List<RedDemandantes>) findByCriteria(criteria);
		if(!WebUtilidades.isEmptyList(list)) return list.get(0);
		return null;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Object[]> findRedDocumentosVigenteByRedDemandanteFolio(
			Long redDemandanteFolio) throws WebException {
		String hqlQuery = WebUtilidades.getQueryByName("redDemandanteDocumentosVigente.findAllByRedDemandanteFolio");
		if(redDemandanteFolio == null) redDemandanteFolio = 0L;
		try {
			return (List<Object[]>) findByHQLQuery(hqlQuery, new Object[]{redDemandanteFolio});
		} catch (WebException e) {
			logger.error(e, e);
		}
		return Collections.emptyList();
	}

	@SuppressWarnings("unchecked")
	@Override
	public Map<String, Object> findByIdAsMap(Long redDemandanteFolio)
			throws WebException {
		String hqlQuery = WebUtilidades.getQueryByName("redDemandante.findById");
		if(redDemandanteFolio == null) redDemandanteFolio = 0L;
		try {
			List<Object[]> list = (List<Object[]>) findByHQLQuery(hqlQuery, new Object[]{redDemandanteFolio});
			if(WebUtilidades.isEmptyList(list)) return null;
			return toMap(list.get(0), new String[]{
				 "redDemandanteFolio",
				 "redDemandanteNumeroDocumento",
				 "ctgDocumentoId",
				 "redDemandanteNombres",
				 "redDemandanteApellidos",
				 "redDemandanteFechaNacimiento",
				 "ctgPaisNacimientoId",
				 "ctgDepartamentoNacimientoId",
				 "ctgMunicipioNacimientoId",
				 "redDemandanteTelefono1",
				 "redDemandanteTelefono2",
				 "redDemandanteTelefono3",
				 "redDemandanteCelular",
				 "ctgTelcoId",
				 "redDemandanteDireccion",
				 "redDemandanteZonaResidencia",
				 "ctgPaisResidenciaId",
				 "ctgDepartamentoResidenciaId",
				 "ctgMunicipioResidenciaId",
				 "ctgGeneroId",
				 "ctgEstadoCivilId",
				 "redDemandantePeso",
				 "redDemandanteEstatura",
				 "redDemandanteLicencia",
				 "ctgTipoLicenciaId",
				 "redDemandanteLicenciaArma",
				 "redDemandanteDUI",
				 "redDemandanteNIT",
				 "redDemandanteISSS",
				 "redDemandanteNUP",
				 "redDemandanteCarneResidente",
				 "redDemandanteVehiculo",
				 "ctgTipoVehiculoId",
				 "redDemandanteAnioVehiculo",
				 "redDemandanteDiscapacidad",
				 "redDemandantePrivado",
				 "redDemandanteEstado",
				 "redDemandanteFechaRegistro",
				 "wkfEstadoSeguimientoId",
				 "sgdUsuarioId",
				 "redDemandanteCorreo",
				 "redDemandanteDependientes",
				 "ctgOficinaId",
				 "ctgMotivoRetiroId",
				 "ctgJornadaId",
				 "ctgTipoContratoId"
			});
		} catch (Exception e) {
			logger.error(e, e);
			throw new WebException("Problemas a tratar de obtener la informaci\u00F3n");
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Object[]> findDemandanteByCriterios(int opcion, String estado,
			String nombreDemandante, CustomUser cu, Long redDemandanteFolio)
			throws WebException {
		Vector<Object> parameters = new Vector<Object>();
		String sqlQuery = WebUtilidades.getQueryByName("redDemandante.findDemandante");
		String where = "";
		switch (opcion) {
			case 1: //EMPRESAS REGISTRADAS POR EL USUARIO
				where += " SGD_USR_ID = ?";
				parameters.add(cu.getSgdUsuarioId());
				break;
			case 2: //EMPRESAS REGISTRADAS A LA OFICINA QUE PERTENECE EL USUARIO
				where += "CTG_OFI_ID = ?";
				parameters.add(cu.getCtgOficinaId());
				break;
			default:
				break;
			
		}
		if(StringUtils.isNotBlank(nombreDemandante) && opcion != 3){//03-10-2012 Agregado por Ricardo Ardon, Filtros para cumplir condicion si no es estado 3
			where += " AND RED_DEM_NOMBRES ILIKE ? "; //Agregado por Hugo Gonzalez 02-10-2012
			parameters.add("%"+nombreDemandante+"%");
		}
		if(!"".equals(estado) && opcion != 3) {
			where += " AND RED_DEM_ACTIVO = ?";
			parameters.add(estado);
		}else {
			where += " RED_DEM_ACTIVO = ?";
			parameters.add(estado);	
			if(StringUtils.isNotBlank(nombreDemandante)){ //03-10-2012 Agregado por Ricardo Ardon, Filtros para busqueda
				where += " AND RED_DEM_NOMBRES ILIKE ? "; //03-10-2012 Agregado por Ricardo Ardon, Filtros para busqueda
				parameters.add("%"+nombreDemandante+"%");
			}	
		}
		
		sqlQuery = StringUtils.replace(sqlQuery, "{WHERE}", StringUtils.isNotBlank(where) ? (" where " + where) : "");
		try {
			return (List<Object[]>) findBySQLQuery(sqlQuery, parameters.toArray());
		} catch (Exception e) {
			throw new WebException("Problemas al ejecutar la busqueda de demandante");
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Object> findRedDemandanteFormacionAcademicaByRedDemandanteFolio(
			Long redDemandanteFolio) {
		DetachedCriteria criteria = DetachedCriteria.forClass(RedFormacionDemandante.class);
		criteria.add(Restrictions.eq("redDemandante.redDemandanteFolio", redDemandanteFolio));
		criteria.createAlias("ctgEscolaridad", "ctgEscolaridad");
		criteria.createAlias("ctgEspecialidad", "ctgEspecialidad");
		criteria.setProjection(Projections.projectionList()
			.add(Projections.property("redFormacionDemandanteId"))
			.add(Projections.property("redFormacionDemandanteInstitucion"))
			.add(Projections.property("ctgEscolaridad.ctgCatalogoNombre"))
			.add(Projections.property("ctgEspecialidad.ctgCatalogoNombre"))
			.add(Projections.property("ctgEscolaridad.ctgCatalogoId"))
		);
		criteria.addOrder(Order.asc("redFormacionDemandanteId"));
		try {
			return (List<Object>) findByCriteria(criteria);
		} catch (WebException e) {
			logger.error(e, e);
		}
		return Collections.emptyList();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Object> findRedDemandanteIdiomaByRedDemandanteFolio(
			Long redDemandanteFolio) {
		DetachedCriteria criteria = DetachedCriteria.forClass(RedIdiomasDemandante.class);
		criteria.add(Restrictions.eq("redDemandante.redDemandanteFolio", redDemandanteFolio));
		criteria.createAlias("ctgIdioma", "ctgIdioma");
		criteria.createAlias("ctgNivel", "ctgNivel");
		criteria.setProjection(Projections.projectionList()
				.add(Projections.property("redIdiomaDemandanteId"))
				.add(Projections.property("ctgIdioma.ctgCatalogoNombre"))
				.add(Projections.property("ctgNivel.ctgCatalogoNombre"))
				.add(Projections.property("ctgIdioma.ctgCatalogoId"))
		);
		criteria.addOrder(Order.asc("redIdiomaDemandanteId"));
		try {
			return (List<Object>) findByCriteria(criteria);
		} catch (WebException e) {
			logger.error(e, e);
		}
		return Collections.emptyList();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Object[]> findRedDisposicionByRedDemandanteFolio(
			Long redDemandanteFolio) throws WebException {
		String hqlQuery = WebUtilidades.getQueryByName("redDemandanteDisposicion.findAllByRedDemandanteFolio");
		if(redDemandanteFolio == null) redDemandanteFolio = 0L;
		try {
			return (List<Object[]>) findByHQLQuery(hqlQuery, new Object[]{redDemandanteFolio});
		} catch (WebException e) {
			logger.error(e, e);
		}
		return Collections.emptyList();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Object[]> findRedMediosBusquedaByRedDemandanteFolio(
			Long redDemandanteFolio) {
		String hqlQuery = WebUtilidades.getQueryByName("redMedioBusquedaDemandante.findAllByRedDemandanteFolio");
		if(redDemandanteFolio == null) redDemandanteFolio = 0L;
		try {
			return (List<Object[]>) findByHQLQuery(hqlQuery, new Object[]{redDemandanteFolio});
		} catch (WebException e) {
			logger.error(e, e);
		}
		return Collections.emptyList();
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public List<Object[]> findRedExistenciaByRedDemandanteFolio(
			Long redDemandanteFolio) {
		String hqlQuery = WebUtilidades.getQueryByName("redExistenciaRedDemandante.findAllByRedDemandanteFolio");
		if(redDemandanteFolio == null) redDemandanteFolio = 0L;
		try {
			return (List<Object[]>) findByHQLQuery(hqlQuery, new Object[]{redDemandanteFolio});
		} catch (WebException e) {
			logger.error(e, e);
		}
		return Collections.emptyList();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Object[]> findRedPuestoDemandante(Long redDemandanteFolio) {
		DetachedCriteria criteria = DetachedCriteria.forClass(RedPuestoBuscaDemandante.class);
		criteria.add(Restrictions.eq("redDemandantes.redDemandanteFolio", redDemandanteFolio));
		criteria.createAlias("redDemandantes", "redDemandantes");
		criteria.createAlias("ctgMotivoRetiro", "ctgMotivoRetiro");
		criteria.createAlias("ocupacion", "ocupacion");
		
		criteria.setProjection(Projections.projectionList()
				.add(Projections.property("redPuestoBuscaDemandanteId"))
				.add(Projections.property("redDemandantes.redDemandanteFolio"))
				.add(Projections.property("redPuestoBuscaDemandanteSalario"))
				.add(Projections.property("redPuestoBuscaDemandanteExperiencia"))
				.add(Projections.property("redPuestoBuscaDemandanteActual"))
				.add(Projections.property("redPuestoBuscaDemandanteEmpresa"))
				.add(Projections.property("redPuestoBuscaDemandanteFecIniMes"))
				.add(Projections.property("redPuestoBuscaDemandanteFecIniAnio"))
				.add(Projections.property("redPuestoBuscaDemandanteFecFinMes"))
				.add(Projections.property("redPuestoBuscaDemandanteFecFinAnio"))
				.add(Projections.property("ctgMotivoRetiro.ctgCatalogoId"))
				.add(Projections.property("redPuestoBuscaDemandanteHoras"))
				.add(Projections.property("redPuestoBuscaDemandanteJefe"))
				.add(Projections.property("redPuestoBuscaDemandanteTelefono"))
				.add(Projections.property("redPuestoBuscaDemandanteFuncion"))
				.add(Projections.property("redPuestoBuscaDemandanteTipoContrato"))
				.add(Projections.property("ocupacion.ocupacionNombre"))
				.add(Projections.property("ocupacion.ocupacionCodigo"))
			);
		try {
			return (List<Object[]>) findByCriteria(criteria);
		} catch (WebException e) {
			logger.error(e, e);
		}
		return Collections.emptyList();
	}

	
	

}
